home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_085 / csh / set.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  4KB  |  165 lines

  1.  
  2. /*
  3.  * SET.C
  4.  *
  5.  * (c)1986 Matthew Dillon     9 October 1986
  6.  *
  7.  * version 2.06M (Manx Version and Additions) by Steve Drew 28-May-87
  8.  *
  9.  */
  10.  
  11. #include "shell.h"
  12. #define MAXLEVELS (3 + MAXSRC)
  13.  
  14. struct MASTER {
  15.    struct MASTER *next;
  16.    struct MASTER *last;
  17.    char *name;
  18.    char *text;
  19. };
  20.  
  21. static struct MASTER *Mbase[MAXLEVELS];
  22.  
  23. char *
  24. set_var(level, name, str)
  25. register char *name, *str;
  26. {
  27.    register struct MASTER *base = Mbase[level];
  28.    register struct MASTER *last;
  29.    register int len;
  30.  
  31.    for (len = 0; isalphanum(name[len]); ++len);
  32.    while (base != NULL) {
  33.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  34.      Free (base->text);
  35.      goto gotit;
  36.       }
  37.       last = base;
  38.       base = base->next;
  39.    }
  40.    if (base == Mbase[level]) {
  41.       base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
  42.       base->last = NULL;
  43.    } else {
  44.       base = (struct MASTER *)malloc (sizeof(struct MASTER));
  45.       base->last = last;
  46.       last->next = base;
  47.    }
  48.    base->name = malloc (len + 1);
  49.    bmov (name, base->name, len);
  50.    base->name[len] = 0;
  51.    base->next = NULL;
  52. gotit:
  53.    base->text = malloc (strlen(str) + 1);
  54.    strcpy (base->text, str);
  55.    return (base->text);
  56. }
  57.  
  58. char *
  59. get_var (level, name)
  60. register char *name;
  61. {
  62.    register struct MASTER *base = Mbase[level];
  63.    register unsigned char *scr;
  64.    register int len;
  65.  
  66.    for (scr = (unsigned char *)name; *scr && *scr != 0x80 && *scr != ' ' && *scr != ';' && *scr != '|'; ++scr);
  67.    len = scr - name;
  68.  
  69.    while (base != NULL) {
  70.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0)
  71.      return (base->text);
  72.       base = base->next;
  73.    }
  74.    return (NULL);
  75. }
  76.  
  77. unset_level(level)
  78. {
  79.    register struct MASTER *base = Mbase[level];
  80.  
  81.    while (base) {
  82.       Free (base->name);
  83.       Free (base->text);
  84.       Free (base);
  85.       base = base->next;
  86.    }
  87.    Mbase[level] = NULL;
  88. }
  89.  
  90. unset_var(level, name)
  91. char *name;
  92. {
  93.    register struct MASTER *base = Mbase[level];
  94.    register struct MASTER *last = NULL;
  95.    register int len;
  96.  
  97.    for (len = 0; isalphanum(name[len]); ++len);
  98.    while (base) {
  99.       if (strlen(base->name) == len && strncmp (name, base->name, len) == 0) {
  100.      if (base != Mbase[level])
  101.         last->next = base->next;
  102.      else
  103.         Mbase[level] = base->next;
  104.      if (base->next != NULL)
  105.         base->next->last = last;
  106.      if (base == Mbase[level])
  107.         Mbase[level] = base->next;
  108.      Free (base->name);
  109.      Free (base->text);
  110.      Free (base);
  111.      return (1);
  112.       }
  113.       last = base;
  114.       base = base->next;
  115.    }
  116.    return (-1);
  117. }
  118.  
  119.  
  120. do_unset_var(str, level)
  121. char *str;
  122. {
  123.    register int i;
  124.  
  125.    for (i = 1; i < ac; ++i)
  126.       unset_var (level, av[i]);
  127.    return (0);
  128. }
  129.  
  130. do_set_var(command, level)
  131. char *command;
  132. {
  133.    register struct MASTER *base = Mbase[level];
  134.    register char *str;
  135.  
  136.    if (ac == 1) {
  137.       while (base) {
  138.      if (CHECKBREAK())
  139.          return(0);
  140.      printf ("%-10s ", base->name);
  141.      puts (base->text);
  142.      base = base->next;
  143.       }
  144.       return (0);
  145.    }
  146.    if (ac == 2) {
  147.       str = get_var (level, av[1]);
  148.       if (str) {
  149.      printf ("%-10s ", av[1]);
  150.      puts(str);
  151.       } else if (level == LEVEL_SET) { /* only create var if set command */
  152.      set_var (level, av[1], "");
  153.       }
  154.    }
  155.    if (ac > 2)
  156.       set_var (level, av[1], next_word (next_word (command)));
  157.    if (*av[1] == '_') {
  158.       S_histlen = (str = get_var(LEVEL_SET, V_HIST))   ? atoi(str) : 0;
  159.       debug    = (str = get_var(LEVEL_SET, V_DEBUG))  ? atoi(str) : 0;
  160.       Verbose    = (get_var(LEVEL_SET, V_VERBOSE)) ? 1 : 0;
  161.       if (S_histlen < 2)   S_histlen = 2;
  162.    }
  163.    return (0);
  164. }
  165.